'''
2分查找：
由于数组是顺序的，于是可以使用二分查找。
先设置左右索引，分别为0和最大-1。
计算中间值：mid=left+(right-left)/2
判断target跟mid。如果相等就直接返回mid。
如果target大于mid对应的值，说明值在右边，left=mid+1，再次循环。
如果target小于mid对应的值，说明值在左边，right=mid-1，再次循环。
判断条件是left<=right，如果等于，则说明是最后一个值。
'''
def search(nums, target):
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = left + (right - left) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

# 测试用例
def test_search():
    # 测试用例 1
    nums1 = [-1, 0, 3, 5, 9, 12]
    target1 = 9
    print(f"Test case 1: {search(nums1, target1)}")  # 预期输出: 4

    # 测试用例 2
    nums2 = [-1, 0, 3, 5, 9, 12]
    target2 = 2
    print(f"Test case 2: {search(nums2, target2)}")  # 预期输出: -1

    # 测试用例 3
    nums3 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    target3 = 5
    print(f"Test case 3: {search(nums3, target3)}")  # 预期输出: 4

    # 测试用例 4
    nums4 = [1, 3, 5, 7, 9]
    target4 = 10
    print(f"Test case 4: {search(nums4, target4)}")  # 预期输出: -1

    # 测试用例 5
    nums5 = [2, 4, 6, 8, 10]
    target5 = 6
    print(f"Test case 5: {search(nums5, target5)}")  # 预期输出: 2

# 运行测试用例
test_search()
